package CutLoad.cookies
{
	import flash.display.DisplayObject;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.Rectangle;
	/**
	 * 对某一个区域进行检测鼠标是否在这个范围内
	 * @author smallerbird mail:smallerbird@gmail.com  site:www.mkigm.com QQ群:49983196
	 * 
	 */	
	public class MouseInOutThisRect extends Sprite
	{
		private var mouseParent:DisplayObject;
		/**
		 * 当前验证的范围 
		 */		
		private var _isStart:Boolean=true;
		private var isFirstIn:Boolean=false;
		private var funInOut:Function;
		//所有范围
		private var arrRect:Array;
		/**
		 * 初始化
		 * @param mouseParent 鼠标坐标相对位置
		 * @param rect 范围
		 * @param funInOut 离开和进入回调方法，格式:function(me:MouseInOutThisRect):void
		 * 
		 */		
		public function MouseInOutThisRect(mouseParent:DisplayObject,rect:Rectangle,funInOut:Function)
		{
			this.mouseParent=mouseParent;
			this.funInOut=funInOut;
			arrRect=new Array();
			arrRect.push(rect);
			this.addEventListener(Event.ENTER_FRAME,enterFrame);
		}
		/**
		 * 重新设置某一个 验证的范围
		 * @param rect
		 * @param index 哪一个
		 * 
		 */		
		public function reSetRect(rect:Rectangle,index:Number=0):void{
			var rect:Rectangle=arrRect[index];
			isFirstIn=false;
		}
		/**
		 * 重新设置所有验证的范围，注：这里会清除所有的
		 * @param arr Rectangle对象数组
		 * 
		 */		
		public function reSetAllRect(arr:Array):void{
			arrRect=arr;
			isFirstIn=false;
		}
		/**
		 * 重新设置所有验证的范围，注：这里会清除所有的  这里会以一个Sprite对象做为参考，获得它的getRect,做为验证范围.
		 * @param spParent
		 * @param endIndex
		 * @param spName 默认:mc
		 * @param startIndex 默认:1
		 * @param isVisible 所有是否隐藏 默认:false
		 * 
		 */		
		public function reSetAllRectFromMcBase(spParent:Sprite,endIndex:Number,spName:String="mc",startIndex:Number=1,isVisible:Boolean=false):void{
			var arr:Array=new Array();
			for(var i:Number=startIndex;i<=endIndex;i++){
				var mc:Sprite=spParent[spName+""+i];
				arr.push(mc.getRect(spParent));
				//trace(mc.getRect(spParent))
				mc.visible=isVisible
			}
			reSetAllRect(arr);
			
		}
		/**
		 * 添加一个需要验证的范围 
		 * @param rect
		 * @return 因为这些范围是用一个数组保存，这里返回它所在数组的下标
		 * 
		 */		
		public function addCheckRect(rect:Rectangle):Number{
			arrRect.push(rect);
			return arrRect.length-1;
		}
		/**
		 * 是否在里面 
		 * @return true进去，false出去
		 * 
		 */		
		public function isIn():Boolean{
			return !isFirstIn
		}
		/**
		 * 彻底清除 
		 * 
		 */		
		public function killMe():void{
			this.removeEventListener(Event.ENTER_FRAME,enterFrame);
			if(this.parent!=null){
				this.parent.removeChild(this)
			}
		}
		/**
		 * 开始 
		 * 
		 */		
		public function start():void{
			_isStart=true;
		}
		/**
		 * 暂停 
		 * 
		 */		
		public function stop():void{
			_isStart=false;
		}
		private function enterFrame(e:Event):void{
			if(!_isStart) return;
			var isInRect:Boolean=false;
			//trace("--------------");
			for(var i:Number=0;i<this.arrRect.length;i++){
				var rect:Rectangle=this.arrRect[i];
				//trace(rect,mouseParent.mouseX,mouseParent.mouseY)
				if(rect.contains(mouseParent.mouseX,mouseParent.mouseY)){
					isInRect=true;
					break;
				}
			}
			//trace("isInRect::"+isInRect)
			if(!isInRect){
				isFirstIn=true;
			}else{
				isFirstIn=false;
			}
			try{
				funInOut(this);
			}catch(e:ArgumentError){
				funInOut();
			}
		}
	}
}